package main

import (
	"fmt"
	"net"
	"net/rpc"
	"net/rpc/jsonrpc"
)

type Hello struct {
}

func (Hello) SayHello(request string, response *string) error {
	*response = "rpc中方法调用成功，接收参数：" + request
	return nil
}

func main() {
	//一、把Hello方法在rpc上注册
	err := rpc.RegisterName("hello", new(Hello))
	if err != nil {
		fmt.Printf("注册服务失败，err-->%v", err)
		return
	}
	//二、监听端口
	listener, err := net.Listen("tcp", "127.0.0.1:9900")
	if err != nil {
		fmt.Printf("端口被占用，err-->%v", err)
		return
	}
	//三、退出时关闭监听
	defer listener.Close()

	for {
		//四、监听端口建立的连接。（只有在监听到连接后，代码才会向下运行，否则一直卡在这里）
		fmt.Println("开始监听连接")
		conn, err := listener.Accept()
		if err != nil {
			fmt.Printf("监听连接失败，err-->%v", err)
			return
		}

		//五、把建立的连接绑定到rpc服务
		go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
	}

}
